Web Streamsã®åãè§£æŸããçŸä»£ã®Webã¢ããªã±ãŒã·ã§ã³ã§å¹ççãªããŒã¿åŠçãå®çŸããŸããããããã©ãŒãã³ã¹ã®åäžãã¡ã¢ãªäœ¿çšéã®åæžãå¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®æ§ç¯æ¹æ³ãåŠã³ãŸãã
Web Streams: çŸä»£ã®ã¢ããªã±ãŒã·ã§ã³ã®ããã®å¹ççãªããŒã¿åŠç
é²åãç¶ãããŠã§ãéçºã®åéã«ãããŠãå¹ççãªããŒã¿åŠçã¯æãéèŠã§ããã¢ããªã±ãŒã·ã§ã³ãããŒã¿éçŽåã«ãªãã«ã€ããŠãããŒã¿ã»ããå šäœãäžåºŠã«èªã¿èŸŒãã§åŠçããåŸæ¥ã®æ¹æ³ã§ã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äœäžãæãããšããããããŸããWeb Streamsã¯ãéçºè ãããŒã¿ãå¢åçã«åŠçããå¿çæ§ãåäžãããã¡ã¢ãªæ¶è²»ãåæžã§ãã匷åãªä»£æ¿ææ®µãæäŸããŸãã
Web Streamsãšã¯ïŒ
Web Streamsã¯ãããŒã¿ã®ã¹ããªãŒã ãæ±ãããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããçŸä»£çãªJavaScript APIã§ããããŒã¿ã»ããå šäœãèªã¿èŸŒãŸããã®ãåŸ ã€ã®ã§ã¯ãªããããŒã¿ãå©çšå¯èœã«ãªã次第ãã£ã³ã¯ã§åŠçããããšãã§ããŸããããã¯ç¹ã«ä»¥äžã®çšéã«åœ¹ç«ã¡ãŸãã
- 倧容éãã¡ã€ã«ïŒäŸïŒåç»ãé³å£°ã倧容éããã¹ããã¡ã€ã«ïŒã®åŠçã
- ãããã¯ãŒã¯ãªã¯ãšã¹ãããã®ããŒã¿ããªã¢ã«ã¿ã€ã ã§åŠçã
- ããŒã¿ãå°çããã«ã€ããŠæŽæ°ãããå¿çæ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®æ§ç¯ã
- ããŒã¿ãããå°ããªãã£ã³ã¯ã§åŠçããããšã«ããã¡ã¢ãªã®ç¯çŽã
Streams APIã¯ãããã€ãã®äž»èŠãªã€ã³ã¿ãŒãã§ãŒã¹ã§æ§æãããŠããŸãã
- ReadableStream: èªã¿åãå¯èœãªããŒã¿ã®ãœãŒã¹ã衚ããŸãã
- WritableStream: æžã蟌ã¿å¯èœãªããŒã¿ã®å®å ã衚ããŸãã
- TransformStream: ReadableStreamããããŒã¿ãèªã¿åãã倿ãããã®çµæãWritableStreamã«æžã蟌ã倿ããã»ã¹ã衚ããŸãã
- ByteLengthQueuingStrategy: ãã£ã³ã¯ã®ãµã€ãºããã€ãåäœã§æž¬å®ãããã¥ãŒã€ã³ã°æŠç¥ã§ãã
- CountQueuingStrategy: ãã£ã³ã¯ã®æ°ãã«ãŠã³ããããã¥ãŒã€ã³ã°æŠç¥ã§ãã
Web Streamsã䜿çšããå©ç¹
ã¢ããªã±ãŒã·ã§ã³ã«Web Streamsãå°å ¥ããããšã§ãããã€ãã®å€§ããªå©ç¹ãåŸãããŸãã
ããã©ãŒãã³ã¹ã®åäž
Web Streamsã¯ããŒã¿ããã£ã³ã¯ã§åŠçãããããããŒã¿ã»ããå šäœãèªã¿èŸŒãŸããåã§ããããã«ããŒã¿ã®åŠçãéå§ã§ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®äœæçãªããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããããå¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸãããŸããäŸãã°ã倧容éã®ãããªãã¡ã€ã«ãã¹ããªãŒãã³ã°ããç¶æ³ãæ³åããŠã¿ãŠãã ãããWeb Streamsã䜿çšãããšããŠãŒã¶ãŒã¯ãã¡ã€ã«å šäœã®ããŠã³ããŒããåŸ ã€ããšãªããã»ãŒããã«ãããªã®èŠèŽãéå§ã§ããŸãã
ã¡ã¢ãªæ¶è²»éã®åæž
Web Streamsã¯ãããŒã¿ã»ããå šäœãã¡ã¢ãªã«ããŒããã代ããã«ãããŒã¿ãå¢åçã«åŠçããŸããããã«ãããã¡ã¢ãªæ¶è²»ãåæžãããã¢ããªã±ãŒã·ã§ã³ã®å¹çãåäžããŸããç¹ã«ã倧容éãã¡ã€ã«ãé£ç¶çãªããŒã¿ã¹ããªãŒã ãæ±ãå Žåã«å¹æçã§ããããã¯ãæºåž¯é»è©±ãçµã¿èŸŒã¿ã·ã¹ãã ãªã©ããªãœãŒã¹ãéãããããã€ã¹ã«ãšã£ãŠéåžžã«éèŠã§ãã
å¿çæ§ã®åäž
Web Streamsã䜿çšãããšãããŒã¿ãå©çšå¯èœã«ãªã次第ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæŽæ°ã§ãããããããã€ã³ã¿ã©ã¯ãã£ãã§é åçãªãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸããäŸãã°ããã¡ã€ã«ã®ããŠã³ããŒãäžã«ãªã¢ã«ã¿ã€ã ã§æŽæ°ãããããã°ã¬ã¹ããŒã衚瀺ãããããŠãŒã¶ãŒãå ¥åããã«ã€ããŠæ€çŽ¢çµæã衚瀺ãããã§ããŸãã ããã¯ããã£ããã¢ããªã±ãŒã·ã§ã³ãã©ã€ãããã·ã¥ããŒããªã©ããªã¢ã«ã¿ã€ã ããŒã¿ãåŠçããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠç¹ã«éèŠã§ãã
ããã¯ãã¬ãã·ã£ãŒç®¡ç
Web Streamsã«ã¯ãçµã¿èŸŒã¿ã®ããã¯ãã¬ãã·ã£ãŒã¡ã«ããºã ãæäŸãããŠãããã¹ããªãŒã ã®ã³ã³ã·ã¥ãŒããŒã¯ãããŒã¿ãçæãããã®ãšåãéãã§ããŒã¿ãåŠçã§ããªãå Žåã«ããããã¥ãŒãµãŒã«é床ãèœãšãããã«ä¿¡å·ãéãããšãã§ããŸããããã«ãããã³ã³ã·ã¥ãŒããŒãå§åãããã®ãé²ããããŒã¿ãå¹ççãã€ç¢ºå®ã«åŠçãããããã«ããŸããããã¯ãä¿¡é Œæ§ã®äœããããã¯ãŒã¯æ¥ç¶ããã®ããŒã¿ãåŠçããå Žåããç°ãªãã¬ãŒãã§ããŒã¿ãåŠçããå Žåã«äžå¯æ¬ ã§ãã
ã³ã³ããŒã¶ããªãã£ãšåå©çšæ§
Web Streamsã¯ãã³ã³ããŒã¶ãã«ã«èšèšãããŠããŸããã€ãŸããè€æ°ã®ã¹ããªãŒã ãç°¡åã«é£çµããŠãè€éãªããŒã¿åŠçãã€ãã©ã€ã³ãäœæã§ããŸããããã«ãããã³ãŒãã®åå©çšæ§ãä¿é²ãããã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ãšä¿å®ã容æã«ãªããŸããäŸãã°ããã¡ã€ã«ããããŒã¿ãèªã¿åããå¥ã®åœ¢åŒã«å€æãããã®åŸå¥ã®ãã¡ã€ã«ã«æžã蟌ãã¹ããªãŒã ãäœæã§ããŸãã
ãŠãŒã¹ã±ãŒã¹ãšäŸ
Web Streamsã¯æ±çšæ§ãé«ããå¹ åºããŠãŒã¹ã±ãŒã¹ã«é©çšã§ããŸãã以äžã«ããã€ãã®äŸã瀺ããŸãã
ãããªãšãªãŒãã£ãªã®ã¹ããªãŒãã³ã°
Web Streamsã¯ããããªããã³ãªãŒãã£ãªã³ã³ãã³ãã®ã¹ããªãŒãã³ã°ã«æé©ã§ããã¡ãã£ã¢ããŒã¿ããã£ã³ã¯ã§åŠçããããšã§ããã¡ã€ã«å šäœãããŠã³ããŒããããåã§ããã»ãŒããã«ã³ã³ãã³ãã®åçãéå§ã§ããŸããããã«ãããç¹ã«é ããããã¯ãŒã¯æ¥ç¶ã«ãããŠãã¹ã ãŒãºã§å¿çæ§ã®é«ãèŠèŽäœéšãæäŸãããŸããYouTubeãNetflixã®ãããªäººæ°ã®ãããããªã¹ããªãŒãã³ã°ãµãŒãã¹ã¯ãã·ãŒã ã¬ã¹ãªãããªåçãã°ããŒãã«ã«æäŸããããã«åæ§ã®ãã¯ãããžãŒã掻çšããŠããŸãã
äŸïŒReadableStreamãš<video>èŠçŽ ã䜿çšãããããªã®ã¹ããªãŒãã³ã°ïŒ
async function streamVideo(url, videoElement) {
const response = await fetch(url);
const reader = response.body.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
// Append the chunk to the video element
// (Requires a mechanism to handle appending data to the video source)
appendBuffer(videoElement, value);
}
}
倧容éããã¹ããã¡ã€ã«ã®åŠç
ãã°ãã¡ã€ã«ãCSVãã¡ã€ã«ãªã©ã®å€§å®¹éããã¹ããã¡ã€ã«ãæ±ãå ŽåãWeb Streamsã¯ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãããã¡ã€ã«ã1è¡ãã€åŠçããããšã§ããã¡ã€ã«å šäœãã¡ã¢ãªã«ããŒãããããšãåé¿ããã¡ã¢ãªæ¶è²»ãåæžããå¿çæ§ãåäžãããŸããããŒã¿åæãã©ãããã©ãŒã ã§ã¯ããªã¢ã«ã¿ã€ã ã§å€§èŠæš¡ãªããŒã¿ã»ãããåŠçããããã«ã¹ããªãŒãã³ã°ãé »ç¹ã«äœ¿çšããŸãã
äŸïŒå€§å®¹éããã¹ããã¡ã€ã«ãèªã¿èŸŒã¿ãè¡æ°ãã«ãŠã³ãããïŒ
async function countLines(file) {
const stream = file.stream();
const decoder = new TextDecoder();
let reader = stream.getReader();
let result = await reader.read();
let lines = 0;
let partialLine = '';
while (!result.done) {
let chunk = decoder.decode(result.value);
let chunkLines = (partialLine + chunk).split('\n');
partialLine = chunkLines.pop() || '';
lines += chunkLines.length;
result = await reader.read();
}
// Account for a last line if it exists
if (partialLine) {
lines++;
}
return lines;
}
ãªã¢ã«ã¿ã€ã ããŒã¿åŠç
Web Streamsã¯ãã»ã³ãµãŒãéèåžå ŽããœãŒã·ã£ã«ã¡ãã£ã¢ãã£ãŒãããã®ããŒã¿ãªã©ããªã¢ã«ã¿ã€ã ããŒã¿ãåŠçããã®ã«é©ããŠããŸããããŒã¿ãå°çããã«ã€ããŠåŠçããããšã§ããŠãŒã¶ãŒã«ææ°æ å ±ãæäŸããå¿çæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããéèååŒãã©ãããã©ãŒã ã¯ãã©ã€ãåžå ŽããŒã¿ã衚瀺ããããã«ã¹ããªãŒã ã«å€§ããäŸåããŠããŸãã
äŸïŒWebSocketã¹ããªãŒã ããã®ããŒã¿ãåŠçããïŒ
async function processWebSocketStream(url) {
const socket = new WebSocket(url);
socket.onmessage = async (event) => {
const stream = new ReadableStream({
start(controller) {
controller.enqueue(new TextEncoder().encode(event.data));
controller.close(); // Close stream after processing one event
}
});
const reader = stream.getReader();
let result = await reader.read();
while (!result.done) {
const decodedText = new TextDecoder().decode(result.value);
console.log('Received data:', decodedText);
result = await reader.read(); // Should only run once since the stream closes
}
};
}
ç»ååŠç
Web Streamsã¯ãããå¹ççãªç»ååŠçãä¿é²ã§ããŸããç»åããŒã¿ãã¹ããªãŒãã³ã°ããããšã§ãç»åå šäœãã¡ã¢ãªã«ããŒãããããšãªãã倿ãæäœãå®è¡ã§ããŸããããã¯ã倧容éã®ç»åãè€éãªãã£ã«ã¿ãŒãé©çšããå Žåã«ç¹ã«äŸ¿å©ã§ãããªã³ã©ã€ã³ç»åãšãã£ã¿ã¯ãããã©ãŒãã³ã¹åäžã®ããã«ã¹ããªãŒã ããŒã¹ã®åŠçãå©çšããããšããããããŸãã
Web Streamsã®å®è£ ïŒå®è·µã¬ã€ã
Web Streamsã䜿çšããŠããã¹ããã¡ã€ã«ãèªã¿èŸŒã¿ããã®å 容ãåŠçããç°¡åãªäŸãèŠãŠã¿ãŸãããã
- ãã¡ã€ã«ããReadableStreamãäœæããïŒ
- ããŒã¿ãçæããããã®WritableStreamãäœæããïŒ
- ããŒã¿ãåŠçããããã®TransformStreamãäœæããïŒ
- ã¹ããªãŒã ããã€ãã§é£çµããïŒ
async function processFile(file) {
const stream = file.stream();
const reader = stream.getReader();
const decoder = new TextDecoder();
let result = await reader.read();
while (!result.done) {
const chunk = decoder.decode(result.value);
console.log('Processing chunk:', chunk);
result = await reader.read();
}
console.log('File processing complete.');
}
const writableStream = new WritableStream({
write(chunk) {
console.log('Writing chunk:', chunk);
// Perform writing operations here (e.g., write to a file, send to a server)
},
close() {
console.log('WritableStream closed.');
},
abort(reason) {
console.error('WritableStream aborted:', reason);
}
});
const transformStream = new TransformStream({
transform(chunk, controller) {
const transformedChunk = chunk.toUpperCase();
controller.enqueue(transformedChunk);
}
});
// Example: Reading from a file, transforming to uppercase, and writing to the console
async function processFileAndOutput(file) {
const stream = file.stream();
const decoder = new TextDecoder();
const reader = stream.getReader();
let result = await reader.read();
while (!result.done) {
const chunk = decoder.decode(result.value);
const transformedChunk = chunk.toUpperCase();
console.log('Transformed chunk:', transformedChunk);
result = await reader.read();
}
console.log('File processing complete.');
}
泚ïŒ`pipeTo`ã¡ãœããã¯ãReadableStreamãWritableStreamã«æ¥ç¶ããããã»ã¹ãç°¡çŽ åããŸãã
//Simplified example using pipeTo
async function processFileAndOutputPiped(file) {
const stream = file.stream();
const transformStream = new TransformStream({
transform(chunk, controller) {
const transformedChunk = new TextEncoder().encode(chunk.toUpperCase());
controller.enqueue(transformedChunk);
}
});
const writableStream = new WritableStream({
write(chunk) {
console.log('Writing chunk:', new TextDecoder().decode(chunk));
}
});
await stream
.pipeThrough(new TextDecoderStream())
.pipeThrough(transformStream)
.pipeTo(writableStream);
}
Web Streamsãæ±ãäžã§ã®ãã¹ããã©ã¯ãã£ã¹
Web Streamsã®å©ç¹ãæå€§éã«åŒãåºãããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããã
- é©åãªãã¥ãŒã€ã³ã°æŠç¥ãéžæããïŒããŒã¿ã®æ§è³ªãšã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ã«åºã¥ããŠãé©åãªãã¥ãŒã€ã³ã°æŠç¥ïŒByteLengthQueuingStrategyãŸãã¯CountQueuingStrategyïŒãéžæããŠãã ããã
- ãšã©ãŒãé©åã«åŠçããïŒã¹ããªãŒã åŠçäžã®äºæããªããšã©ãŒãäŸå€ãé©åã«åŠçããããã«ãå ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŠãã ããã
- ããã¯ãã¬ãã·ã£ãŒã广çã«ç®¡çããïŒçµã¿èŸŒã¿ã®ããã¯ãã¬ãã·ã£ãŒã¡ã«ããºã ãå©çšããŠãã³ã³ã·ã¥ãŒããŒãå§åãããã®ãé²ããå¹ççãªããŒã¿åŠçã確å®ã«ããŠãã ããã
- ãã£ã³ã¯ãµã€ãºãæé©åããïŒããã©ãŒãã³ã¹ãšã¡ã¢ãªæ¶è²»ã®æé©ãªãã©ã³ã¹ãèŠã€ããããã«ãããŸããŸãªãã£ã³ã¯ãµã€ãºã詊ããŠãã ããããã£ã³ã¯ãå°ãããšåŠçãªãŒããŒããããé »ç¹ã«çºçãããã£ã³ã¯ã倧ãããšã¡ã¢ãªäœ¿çšéãå¢å ããå¯èœæ§ããããŸãã
- ããŒã¿å€æã«TransformStreamsã䜿çšããïŒTransformStreamsãæŽ»çšããŠãã¢ãžã¥ãŒã«åãããåå©çšå¯èœãªæ¹æ³ã§ããŒã¿å€æãå®è¡ããŠãã ããã
- ããªãã£ã«ãæ€èšããïŒWeb Streamsã¯ææ°ã®ãã©ãŠã¶ã§åºããµããŒããããŠããŸãããå€ããã©ãŠã¶ãšã®äºææ§ã確ä¿ããããã«ããªãã£ã«ã䜿çšããããšãæ€èšããŠãã ããã
ãã©ãŠã¶ã®äºææ§
Web Streamsã¯ãChromeãFirefoxãSafariãEdgeãå«ããã¹ãŠã®ã¢ãã³ãã©ãŠã¶ã§ãµããŒããããŠããŸãããã ããå€ããã©ãŠã¶ã§ã¯äºææ§ãæäŸããããã«ããªãã£ã«ãå¿ èŠãªå ŽåããããŸãããCan I useãã®ãããªãªãœãŒã¹ã䜿çšããŠãã©ãŠã¶ã®äºææ§ã確èªã§ããŸãã
çµè«
Web Streamsã¯ãçŸä»£ã®Webã¢ããªã±ãŒã·ã§ã³ã§ããŒã¿ãåŠçããããã®åŒ·åãã€å¹ççãªæ¹æ³ãæäŸããŸããããŒã¿ãå¢åçã«åŠçããããšã§ãããã©ãŒãã³ã¹ãåäžãããã¡ã¢ãªæ¶è²»ãåæžããããå¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœæã§ããŸãããããªã®ã¹ããªãŒãã³ã°ã倧容éããã¹ããã¡ã€ã«ã®åŠçããªã¢ã«ã¿ã€ã ããŒã¿ã®åŠçã®ãããã«ãããŠããWeb Streamsã¯é«æ§èœã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«å¿ èŠãªããŒã«ãæäŸããŸãã
Webã¢ããªã±ãŒã·ã§ã³ãé²åãç¶ããããå¹ççãªããŒã¿åŠçãæ±ããããã«ã€ããŠãWeb Streamsãç¿åŸããããšã¯ãäžçäžã®Webéçºè ã«ãšã£ãŠãŸããŸãéèŠã«ãªã£ãŠããŸãããã®ãã¯ãããžãŒãæ¡çšããããšã§ãããé«éã§ãããå¿çæ§ãé«ããããæ¥œãã䜿ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã